package apibasej.basic.pool;

import java.util.ArrayList;

import apibasej.basic.config.ConfigManager;



public class ItemPool extends ConfigManager{


	private boolean busy = false;
	private boolean invalidated = false;
	
	// pode ser chamado close() se for um pool de conexões ... etc
	//public void onInvalidate(){}; // usar sobrescrita dos métodos
	//public void onRelease(){};
	
	private ArrayList<ItemPool> poolTemp;
	
	// libera para uso
	public final void release(){// manter final para garantir desempenho, pois estes métodos são chamados dentro de sinc ...
		
		//se for um ItemPool temporário deve ser invalidado ao terminar e removido da lista de temps
		if(poolTemp!=null){
			poolTemp.remove(this);
			invalidate();//chamar a função! pois pode ser sobrescrita
		}
		
		this.busy = false;
	}
	
	//synchroni ??? (evitar synch ao máximo! por causa de deadloks!)
	//(neste caso não tem problemas pois não tem perigo da acão dentro do sinc chamar outro sinc)
	public final synchronized boolean isBusy(){// manter final para garantir desempenho, pois estes métodos são chamados dentro de sinc ...
		return busy;
	}
	public final synchronized void setBusy(){// manter final para garantir desempenho, pois estes métodos são chamados dentro de sinc ...
		this.busy = true;
	}
	public final synchronized boolean isInvalidated(){// manter final para garantir desempenho, pois estes métodos são chamados dentro de sinc ...
		return invalidated;
	}
	
	public void invalidate(){
		this.invalidated = true;
	}
	
	
	public void setPoolTemp(ArrayList<ItemPool> poolTemp) {
		this.poolTemp = poolTemp;
	}

	@Override
	public boolean equals(Object obj) {
		return this==obj;
	}
	
}
